- Notifications
You must be signed in to change notification settings - Fork 55
/
Copy pathMazePathDiagonal.java
105 lines (76 loc) Β· 2.58 KB
/
MazePathDiagonal.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
packagesection19_DynamicProgramming;
importjava.util.Arrays;
publicclassMazePathDiagonal {
publicstaticvoidmain(String[] args) {
intn = 500;
intcr = 0, cc = 0, er = n, ec = n;
// System.out.println(mazePathDiagonalRecursive(cr, cc, er, ec));
System.out.println(mazePathDiagonalTopDownDP(cr, cc, er, ec, newint[n + 1][n + 1]));
System.out.println(mazePathDiagBottomUpDP(er, ec));
System.out.println(mazePathDiagBottomUpSpaceEfficient(er, ec));
}
// O(3^(er + ec)) Time | recursion extra space
publicstaticintmazePathDiagonalRecursive(intcr, intcc, inter, intec) {
if (cr > er || cc > ec) {
return0;
}
if (cr == er && cc == ec) {
return1;
}
inthorizontalCount = mazePathDiagonalRecursive(cr, cc + 1, er, ec);
intverticalCount = mazePathDiagonalRecursive(cr + 1, cc, er, ec);
intdiagonalCount = mazePathDiagonalRecursive(cr + 1, cc + 1, er, ec);
inttotalPaths = horizontalCount + verticalCount + diagonalCount;
returntotalPaths;
}
// O(er*ec) Time | O(er*ec) Space + recursion extra space
publicstaticintmazePathDiagonalTopDownDP(intcr, intcc, inter, intec, int[][] storage) {
if (cr > er || cc > ec) {
return0;
}
if (cr == er && cc == ec) {
return1;
}
if (storage[cr][cc] != 0) {
returnstorage[cr][cc];
}
inthorizontalCount = mazePathDiagonalTopDownDP(cr, cc + 1, er, ec, storage);
intverticalCount = mazePathDiagonalTopDownDP(cr + 1, cc, er, ec, storage);
intdiagonalCount = mazePathDiagonalTopDownDP(cr + 1, cc + 1, er, ec, storage);
inttotalPaths = horizontalCount + verticalCount + diagonalCount;
storage[cr][cc] = totalPaths;
returntotalPaths;
}
// O(er*ec) Time | O(er*ec) Space
publicstaticintmazePathDiagBottomUpDP(inter, intec) {
int[][] storage = newint[er + 2][ec + 2];
for (introw = er; row >= 0; row--) {
for (intcol = ec; col >= 0; col--) {
if (row == er && col == ec) {
storage[row][col] = 1;
} else {
storage[row][col] = storage[row][col + 1] + storage[row + 1][col] + storage[row + 1][col + 1];
}
}
}
returnstorage[0][0];
}
// O(er*ec) Time | O(ec) Space
publicstaticintmazePathDiagBottomUpSpaceEfficient(inter, intec) {
int[] storage = newint[ec + 1];
Arrays.fill(storage, 1);
for (intslide = er - 1; slide >= 0; slide--) {
intdiagonalvalue = 1;
for (intcol = ec; col >= 0; col--) {
if (col == ec) {
storage[col] = 1;
} else {
intsum = storage[col] + storage[col + 1] + diagonalvalue;
diagonalvalue = storage[col];
storage[col] = sum;
}
}
}
returnstorage[0];
}
}